草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - Valgrind 能捕捉到各种未定义的行为吗?

换句话说,如果我的程序在没有任何Valgrind错误消息的情况下运行,我能确定我的程序没有未定义行为吗? 最佳答案 这里有一个根本性的错误。Valgrind不是某种理解C++语法语义的静态分析工具,因此知道您何时按照C++标准的规定调用未定义的行为。Valgrind是一种工具,但是当您在内存中执行因程序的未定义行为而导致的操作时,它会提醒您。例如,它会检测您何时访问未分配或已释放的内存,它会检测您何时使用未初始化(或部分未初始化)的值/缓冲区进行系统调用等...打个医学类比,Valgrind检测未定义行为的症状。没有症状并不意味着没

c++ - 奇怪的参数传递——这样安全吗?

我正在处理一些遗留代码,我遇到了一些我不确定是否安全的东西——事实上我很确定它是未定义的,但我不完全确定为什么(或多或少是一种不好的感觉).出于某种原因,这段代码有一个类,我们称它为A。A类有一个重载的预递增运算符(++),它似乎对包含在其中的指针的值进行一些操作(我们我们将调用该指针B)。我发现了一个函数调用,用户在其中传入A和指针B的取消引用拷贝,同时使用已重载的预递增运算符。foo(++A,*B);由于A的预增量修改了B指向的值,并且B被取消引用并用作同一个调用中的参数...是否有问题或者我应该这样?抱歉,如果这听起来令人困惑-代码太复杂而无法粘贴,但我已尽力解释情况。如果需要,

c++ - 将 '\0' 添加到 std::string 时出现意外行为

为什么C++标准允许以下内容?#include#includeintmain(){std::strings(10,'\0');//s.length()nowis10std::cout为什么要加0算呢?它看起来像是破坏了字符串的完整性,不是吗?但我检查了标准,这是正确的行为。 最佳答案 Whydoesstandardallowsfollowing?因为设计C++字符串的人决定允许这样的事情发生。我不确定设计C++字符串的团队中是否有人在SO上……但是既然你自己说标准允许它,那就是它的方式,我怀疑它是否会改变。有时拥有一个可以包含“任何

c++ -/fp :fast 的奇怪结果

我们有一些看起来像这样的代码:inlineintcalc_something(doublex){if(x>0.0){//dosomethingreturn1;}else{//dosomethingelsereturn0;}}不幸的是,当使用标志/fp:fast时,我们得到calc_something(0)==1所以我们显然采用了错误的代码路径。只有当我们在代码中使用不同参数的多个点使用该方法时才会发生这种情况,因此我认为编译器(MicrosoftVisualStudio2008,SP1)在此处进行了一些可疑的优化。此外,当我们将界面更改为时,上述问题就消失了inlineintcalc_

c++: string::find 对于空输入字符串的行为是否定义明确

以下代码片段在我的编译器(visualstudio)上始终返回true。但这种行为是否定义明确且可移植?boolreturn_always_true(std::stringconst&str){returnstr.find("")!=std::string::npos;}intmain(){cout 最佳答案 我找到了cppreference.com比标准更容易阅读。引用他们:Findsthefirstsubstringequaltostr...Formally,asubstringstrissaidtobefoundatposit

c++ - 为什么 "%I64d"在同一格式字符串中多次使用时会给出奇怪的输出?

当我在codeforces上解决一个编程问题时,我发现当格式说明符“%I64d”在同一格式字符串中被多次使用时,例如:longlonginta,b,c;a=1,b=3,c=5;printf("%I64d%I64d%I64d\n",a,b,c);输出是103然而,当我将每个说明符分开时,例如:longlonginta,b,c;a=1,b=3,c=5;printf("%I64d",a);printf("%I64d",b);printf("%I64d",c);puts("");输出如预期的那样:135这是查看上述代码片段的ideone链接:http://ideone.com/f2udRB请帮

c++ - 奇怪的编译器错误 : "undefined reference to ' main'"

谁能告诉我这是什么意思?/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:Infunction`_start':(.text+0x18):undefinedreferenceto`main'collect2:ldreturned1exitstatusmake:***[program]Error1我的make文件如下所示:program:main.orender.oscreenwriter.og++-omain.orender.oscreenwriter.o-lSDLmain.o:main.cpprender

c++ - 如何让 g++ 拒绝任何表现出未定义行为的代码?

我想添加一个CXXFLAG我的构建系统迫使整个代码库被明确定义。因此,编译器应该拒绝以静态方式表现出未定义行为的每一段代码。例如reinterpret_cast(someIntPtr)->aMember没有任何未定义的运行时上下文(a),而inti=bar();i/=i;可能会导致未定义的行为(b),具体取决于bar()的运行时评估(可能返回零)。我只希望(a)案例被抓到,不一定是(b)案例。 最佳答案 我不确定您的目标在计算上是否可行。但是,您将适度接近-Wall-Wextra-Werror;查看其他警告选项以了解您还想启用什么。

c++奇怪的std::cout行为使用指针

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whatisthecorrectanswerforcout我刚输出文字,突然注意到。#includeintmain(){intarray[]={1,2,3,4};int*p=array;std::cout这样的行为对我来说很奇怪,为什么会这样?

c++ - 编译器的行为是否未定义,具有未定义的行为?

当我answered这个question,我写道:First,itisimportanttonotethatitisnotonlythebehaviouroftheuserprogramthatisundefined,itisthebehaviourofthecompilerthatisundefined.但是有disagreementinacomment,所以我想在这里问这个问题:如果源代码包含未定义行为,是只有翻译后的机器码行为未定义,还是编译器的行为也未定义?该标准定义了抽象机(1.9)的行为:ThesemanticdescriptionsinthisInternationalS